package szc.common.code.util;

import org.apache.commons.io.FileUtils;
import szc.common.code.enums.FileTypeEnum;
import szc.common.code.file.CodeFileFinder;
import szc.common.code.tool.FileCodeCount;

import java.io.File;
import java.util.*;

/**
 * @desc 代码工具
 * @author songzc
 * @date 2022/6/18
 */
public class CodeUtils {

    /**
     * 统计代码行数：指定文件类型
     * @param dir
     * @return
     * @throws Exception
     */
    public static int countCodeLine(File dir,FileTypeEnum fileTypeEnum) throws Exception {
        CodeFileFinder fileFinder = new CodeFileFinder(dir, fileTypeEnum);
        Collection<File> allFiles = fileFinder.findAllFiles();
        if(allFiles.isEmpty()){
            return 0;
        }
        FileCodeCount javaFileCount = new FileCodeCount(fileTypeEnum);
        for (File f : allFiles){
            javaFileCount.setSourceCodeFile(f);
            javaFileCount.countByRules();
        }
        return javaFileCount.getNormalLineCount();
    }

    /**
     * 统计代码行数：指定文件类型集合
     * @param dir 文件夹
     * @return
     * @throws Exception
     */
    public static Map<String, Integer> countCodeLine(File dir,FileTypeEnum[] fileTypeEnums) throws Exception {
        if(fileTypeEnums.length==1){
           return Collections.singletonMap(fileTypeEnums[0].getSuffix(),countCodeLine(dir,fileTypeEnums[0]));
        }
        // <文件名,FileTypeEnum>
        Map<String,FileTypeEnum> allFileTypeMap = new HashMap<>();
        // 找到所有类型的文件
        Collection<File> fileList=FileUtils.listFiles(dir, Arrays.stream(fileTypeEnums).map(ft -> {
            allFileTypeMap.put(ft.getSuffix(), ft);
            return ft.getSuffix().substring(1);
        }).toArray(String[]::new), true);
        // 文件归类 <文件名,Files>
        Map<String,Collection<File>> fileMap = new HashMap<>();
        for (File f1:fileList){
            String fileExt = getFileExt(f1.getName());
            if(allFileTypeMap.containsKey(fileExt)){
                Collection<File> collection = null;
                if(fileMap.containsKey(fileExt)){
                    collection = fileMap.get(fileExt);
                }else {
                    collection = new ArrayList<>();
                    fileMap.put(fileExt,collection);
                }
                collection.add(f1);
            }
        }
        // 分类统计
        Map<String, Integer> fileLineMap = new HashMap<>();
        for(String fileType: fileMap.keySet()){
            FileCodeCount javaFileCount = new FileCodeCount(allFileTypeMap.get(fileType));
            for (File f2 : fileMap.get(fileType)){
                javaFileCount.setSourceCodeFile(f2);
                javaFileCount.countByRules();
            }
            fileLineMap.put(fileType, javaFileCount.getNormalLineCount());
        }
        return fileLineMap;
    }

    // 获取文件后缀名
    public static String getFileExt(String fileName) {
        if(fileName.lastIndexOf(".") != -1 && fileName.lastIndexOf(".") != 0){
            return fileName.substring(fileName.lastIndexOf("."));
        }
        return " ";
    }

}
